package com.qfedu.aunt.commons.service.impl;

import com.qfedu.aunt.commons.auth.security.TokenManager;
import com.qfedu.aunt.commons.dto.PermDTO;
import com.qfedu.aunt.commons.pojo.Perm;
import com.qfedu.aunt.commons.pojo.User;
import com.qfedu.aunt.commons.mapper.UserMapper;
import com.qfedu.aunt.commons.service.UserService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author xiaobobo
 * @since 2022-10-31
 */
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {

    @Autowired
    private TokenManager tokenManager;

    @Autowired
    private UserMapper userMapper;

    @Override
    public List<PermDTO> findMenuByToken(HttpServletRequest req) {
        //首先应该:获取token
        String token = req.getHeader("token");
        //接下来获取用户id
        String userId = tokenManager.getUserId(token);
        //有了用户id 接下来通过id查询用户具有的菜单
        //下面的这个集合是没有树形结构的
        List<PermDTO> permList=userMapper.findMenuByUserId(userId);
        //构建树形结构
        List<PermDTO> permTreeList=buildMenuTree(permList);
        return permTreeList;
    }

    /**
     * 将返回的这个集合 弄成树形结构
     * 要用到递归
     * @param permList
     * @return
     */
    private List<PermDTO> buildMenuTree(List<PermDTO> permList) {
        //首先初始化一个容器 用来存储这个树形结构
        List<PermDTO> perms=new ArrayList<>();
        //循环找到这个递归的入口
        permList.stream().forEach(p->{
            //说明是最大的一级的这个菜单
            if(p.getParentId().equals("0001")){
                //接下来找到了递归的入口
                perms.add(findChildMenu(p,permList));
            }
        });
        return perms;
    }

    /**
     * 找到孩子的这个菜单
     * @param p
     * @param permList
     * @return
     */
    private PermDTO findChildMenu(PermDTO p, List<PermDTO> permList) {
        //遍历整个菜单的集合
        permList.stream().forEach(p1->{
            //如果条件成立 那么说明 我们的p1是p的孩子
            if(p.getId().equals(p1.getParentId())){
                if(p.getSubs()==null){
                    p.setSubs(new ArrayList<>());
                }
                //然后执行到这里来 说明p1是p的孩子
                p.getSubs().add(findChildMenu(p1,permList));
            }
        });
        //不管怎样 最终都要将这个p标签返回去  还要将这个p中的孩子设置进去
        return p;
    }
}
